#ifndef WEBSERVER_H
#define WEBSERVER_H

#include <arpa/inet.h>
#include <cstdint>
#include <memory>

#include "../http/httpconn.h"
#include "../timer/heaptimer.h"
#include "../pool/threadpool.h"
#include "epoller.h"

class WebServer {
public:
    /*
        参数说明：
            1. trigMode：epoll的触发模式
            2. OptLinger：是否启用SO_LINGER选项。
                在TCP连接中，SO_LINGER选项用于控制当socket关闭时，是否等待未发送的数据被发送出去。
                如果设置为true，服务器可能会在关闭连接时等待数据完全发送。
    */
    WebServer(
        int port, int trigMode, int timeoutMS, bool OptLinger,
        int sqlPort, const char* sqlUser, const char* sqlPwd,
        const char* dbName, int connPoolNum, int threadNum,
        bool openLog, int logLevel, int logQueSize
        );
    ~WebServer();

    void Start();
private:
    bool InitSocket_();
    void InitEventMode_(int trigMode);
    void AddClient_(int fd, sockaddr_in addr);

    void DealListen_();
    void DealWrite_(HttpConn* client);
    void DealRead_(HttpConn* client);

    void SendError_(int fd, const char* info);
    void ExtentTime_(HttpConn* client); // 不知道有啥用
    void CloseConn_(HttpConn* client);

    void OnRead_(HttpConn* client);
    void OnWrite_(HttpConn* client);
    void OnProcess(HttpConn* client);

    static const int MAX_FD = 65536;
    
    // 设置为非阻塞IO
    static int SetFdNonblock(int fd);

    int port_;
    bool openLinger_;
    int timeoutMS_;
    bool isClose_;
    // 服务器的监听端口
    int listenFd_;
    char* srcDir_;

    uint32_t listenEvent_;
    uint32_t connEvent_;

    std::unique_ptr<HeapTimer> timer_;
    std::unique_ptr<ThreadPool> threadpool_;
    std::unique_ptr<Epoller> epoller_;
    // 文件描述符:Http连接
    std::unordered_map<int, HttpConn> users_;
};

#endif